home *** CD-ROM | disk | FTP | other *** search
/ Tech Arsenal 1 / Tech Arsenal (Arsenal Computer).ISO / tek-04 / bipl.zip / PROGS.ZIP / DETEX.ICN (.txt) < prev    next >
LaTeX Document  |  1992-11-26  |  5KB  |  132 lines

  1. ############################################################################
  2. #    File:     detex.icn
  3. #    Subject:  Program to strip LaTeX commands
  4. #    Author:   Clinton L. Jeffery
  5. #    Date:     September 8, 1990
  6. ###########################################################################
  7. #     Program that reads in documents written in the LaTeX typesetting
  8. #  language, and removes some of the common LaTeX commands to produce
  9. #  plain ASCII.  This program is not a full LaTeX parser, and output must
  10. #  typically be further edited by hand to produce an acceptable result.
  11. global fin, fout, silent, date, bibliography
  12. procedure main(args)
  13.     local cut, i, j
  14.     initialize()
  15.     cut := ""
  16.     if *args=0 then {
  17.     every write(\ (detex(!&input)))
  18.     } else {
  19.     i := 1
  20.     while (args[i][1] == "-") do {
  21.         case args[i] of {
  22.         "-silent": silent := 1
  23.         "-cut"   : cut := "-cut"
  24.         default  : write(&errout,"dont know option ",args[i])
  25.         }
  26.         i +:= 1
  27.     if /silent then write(&errout,"Detex version 1.10 executed on ",date)
  28.     if j := find(".tex",args[i]) then args[i][j:0] := ""
  29.     fin := open(args[i]||".tex","r") |
  30.         stop("detex: couldn't open ",args[i],".tex for reading")
  31.     fout := open(args[i]||".doc","w") |
  32.         stop("detex: couldn't open ",args[i],".doc for writing")
  33.     every write(fout,\ (detex(!fin)))
  34.     close(fin)
  35.     if \bibliography then {
  36.         fin := open(bibliography,"r") |
  37.         write(&errout,"detex: couldn't open ",
  38.               bibliography," for reading")
  39.         every write(fout,\ (debib(detex(!fin))))
  40.     close(fout)
  41.     }
  42. procedure initialize()
  43.     date := &dateline[find(",",&dateline)+2:0]
  44.     date := reverse(date)
  45.     date := date[find(":",date)+1:0]
  46.     date := date[many(&digits,date):0]
  47.     date := reverse(date)
  48. # strip comments.  so far we only strip entire-line comments
  49. procedure detex(s)
  50.     if *s>0 & s[1]=="%" then fail
  51.     return defootnote(deline(debrace(demacro(s))))
  52. # remove footnotes and similar multiline entities
  53. # all footnotes are assumed to end in }. and this is processed after
  54. # all single-line entities were already processed
  55. procedure defootnote(s)
  56.     if s == "}" then return ""
  57.     while s[find("\\footnote{",s) +: *"\\footnote{"] := " ("
  58.     while s[find("}.",s) +: *"}."] := ")."
  59.     return s
  60. # This routine handles macros that may appear anywhere on a line
  61. # Footnotes are translated into parentheses.
  62. # The close of all footnotes are assumed to be }.
  63. procedure demacro(s)
  64.     local i
  65.     while i := find("\\today",s) do {
  66.     s[i:i+*"\\today"] := date
  67.     }
  68.     while i := find("\\cite{",s) do {
  69.     s[i:i+*"\\cite{"] := "["
  70.     s[find("}",s,i)] := "]"
  71.     }
  72.     while s[find("\\linebreak",s) +: *"\\linebreak"] := ""
  73.     while s[find("\\/"|"\\\\"|"\\>",s) +: 2] := ""
  74.     while s[find("``"|"''",s) +: 2] := "\""
  75.     while s[ find("\\&"|"\\$"|"\\_",s) ] := ""
  76.     return s
  77. # extra help for .bbl files
  78. procedure debib(s)
  79.     local i
  80.     while s[find("~",s)] := ""
  81.     while (i:=find("{",s))=(find("}",s)-2) do s[i+:3] := s[i+1]
  82.     while (i:=find("{",s))=(find("}",s)-3) do s[i+:4] := s[i+1]
  83.     return s
  84. # This procedure handles macros that comprise and entire line
  85. procedure deline(s)
  86.     local command, body
  87.     if s[1] == "\\" then s ? {
  88.     move(1)
  89.     command := tab(many(&letters))
  90.     case command of {
  91.         "item": {
  92.         move(1) # past [
  93.         body := tab(upto(']'))
  94.         move(1)
  95.         return body || tab(0)
  96.         }
  97.         "bibitem": {
  98.         body := tab(upto(']')+1)
  99.         return body
  100.         }
  101.         "newblock": {
  102.         move(1)
  103.         body := tab(0)
  104.         return body
  105.         }
  106.         "bibliography": {
  107.         tab(upto('{')+1)
  108.         if not (body := tab(upto('}'))) then body := tab(0)
  109.         bibliography := body || ".bbl"
  110.         return trim(center("References",70))
  111.         }
  112.         "title" | "author" | "date" | "section" | "subsection" |
  113.         "subsubsection": {
  114.             tab(upto('{')+1) # handle both \section{ and \section*{
  115.             if not (body := tab(upto('}'))) then body := tab(0)
  116.             return trim(center(body,70))
  117.         default: return ""
  118.     } else
  119.     return s
  120. # This procedure removes braces which get inserted by common single-line
  121. # environments such as font changes
  122. procedure debrace(s)
  123.     local i, j
  124.     s ||:= " "
  125.     while i := find("{\\em "|"{\\tt ",s) do {
  126.     j := &null
  127.     every j := bal(&cset,'{','}',s,i,0) \ 2
  128.     if \j then {
  129.             s := s[1:i] || s[i+5:j-1] || s[j:0]
  130.     }
  131.     return trim(s)
  132.